package com.honry.common.domain.model;

import java.io.Serializable;

import com.honry.common.AssertionConcern;

/**
 * 实体的值类型ID的抽象类。
 * @author machao
 *
 */
public abstract class AbstractId extends AssertionConcern implements Identity,Serializable{
	private static final long serialVersionUID = 1L;
	private String id;
	public AbstractId() {
		
	}
	public AbstractId(String anId){
		setId(anId);
	}
	
	/**
	 * 奇数
	 * @return
	 */
	protected abstract int hashOddValue();
	
    /**
     * 质数
     * @return
     */
    protected abstract int hashPrimeValue();

    /**
     * 缺省实现，如果子类需要验证id，请覆写此方法，如果无效抛出一个运行时异常。
     * @param anId
     */
    protected void validateId(String anId){
    	
    }
    
	@Override
	public String id() {
		return this.id;
	}
	private void setId(String anId){
		assertArgumentNotEmpty(anId, "id为必填项，不能为空.");
		assertArgumentLength(anId, 36,36, "id长度必须为36.");
		this.validateId(anId);
		this.id=anId;
	}
	
	@Override
	public boolean equals(Object obj) {
		boolean equalsObjects=false;
		//判断是否为同一类型
		if(obj!=null&&obj.getClass()==this.getClass())
		{
			AbstractId typedObject=(AbstractId)obj;
			//判断id是否相等。
			equalsObjects=this.id.equals(typedObject.id);
		}
		return equalsObjects;
	}
	@Override
	public int hashCode() {
		int hashCodeValue=(this.hashOddValue()*this.hashPrimeValue())
				+this.id.hashCode();
		return hashCodeValue;
	}
	@Override
	public String toString() {
		
		return this.getClass().getSimpleName()+"[id="+id+"]";
	}
	
	
	
}
